package app

// State 单元流域汇流，包括坡地汇流和河网汇流，都采用线性水库法
type State struct {
	//========外部输入========//
	P  float64 `json:"P;default:30"` //单元流域降雨量，mm
	EM float64 `json:"EM"`           //单元流域水面蒸发量，mm
	F  float64 `json:"F"`            //单元流域面积,km2
	DT float64 `json:"DT"`           //模型计算时段长,h

	//========模型状态========//
	S0 float64 `json:"S0"`
	//double m_S0;   //本时段初产流面积上的平均自由水深，mm
	FR float64 `json:"FR"`
	//double m_FR;   //本时段产流面积比例
	EU  float64 `json:"EU"` //上层蒸散发量，mm
	EL  float64 `json:"EL"` //下层蒸散发量，mm
	ED  float64 `json:"ED"` //深层蒸散发量，mm
	E   float64 `json:"E"`  //总的蒸散发量，mm
	EP  float64 `json:"EP"` //流域蒸发能力，mm
	WU  float64 `json:"WU"` //上层张力水蓄量，mm
	WL  float64 `json:"WL"` //下层张力水蓄量，mm
	WD  float64 `json:"WD"` //深层张力水蓄量，mm
	W   float64 `json:"W"`  //总的张力水蓄量，mm
	RIM float64 `json:"RIM"`
	R   float64 `json:"R"`
	//double m_R;	    //总径流量，mm
	RS float64 `json:"RS"`
	//double m_RS;   //地面径流，mm
	RI float64 `json:"RI"`
	//double m_RI;   //壤中流，mm
	RG float64 `json:"RG"`
	//double m_RG;   //地下径流，mm
	PE float64 `json:"PE"`
	//double m_PE;   //净雨量，mm，PE = P - KC * EM
	QS float64 `json:"QS"`
	//double m_QS;   //地面径流汇流，m3/s
	QI float64 `json:"QI"`
	//double m_QI;   //壤中流汇流，m3/s
	QG float64 `json:"QG"`
	//double m_QG;   //地下径流汇流，m3/s
	QU float64 `json:"QU"`
	//double m_QU;   //本时段末单元流域出口流量，m3/s
	QU0 float64 `json:"QU0"`
	//double m_QU0;   //上一时段末即本时段初的单元流域出口流量，m3/s
	O []float64 `json:"O"`
	//double * m_O;    //单元流域在各子河段出口断面形成的出流，m3/s
	O2 float64 `json:"O2"`
	//double m_O2;   //单元流域在全流域出口断面形成的出流，m3/s

	//========输出外部========//
	MQ float64 `json:"MQ"` //流域出口断面流量，m3/s
}

func (s *State) SetParams() {
	// 设置默认参数
	s.WU = 10
	s.WL = 30
	s.WD = 20
	s.W = 60
}

// SetDT 设置时间尺度
func (s *State) SetDT(dt int) {
	s.DT = float64(dt)
}

// SetInput 设置外部输入源 EP(实际降雨) EM(蒸发)  F(面积)
func (s *State) SetInput(i int, j int, watershed Watershed) {
	s.P = watershed.GetP(i, j)
	s.EM = watershed.GetEM(i, j)
	s.F = watershed.GetF(j)
}
